﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProjetoJornada_DAL.Repositorio;
using Basicas.Utils;
using Basicas;
using Basicas.Utils.excecoes;

namespace ProjetoJornada_Negocios.Negocio
{
    public class NegocioTurma
    {
        private RepTurma repTurma;
        private RepCursoNaJornada repCursoNaJornada;

        public NegocioTurma()
        {
            this.repTurma = new RepTurma();
            this.repCursoNaJornada = new RepCursoNaJornada();
        }

        public bool Inserir(Turma turma)
        {
            try
            {
                if (turma.DataInicial.CompareTo(turma.DataFinal) > 0)
                {
                    throw new PeriodoInvalidoException();
                }

                int idJornada = turma.Jornada.Id;
                int idCurso = turma.Curso.Id;

                int idCursoNaJornada = repCursoNaJornada.JaExisteCursoNaJornada(idCurso, idJornada);

                if (idCursoNaJornada == 0)
                {
                    idCursoNaJornada = repCursoNaJornada.Inserir(idCurso, idJornada);
                }
                turma.IdJornadaCurso = idCursoNaJornada;


                int quantidadeDeTurmas = repTurma.GetQuantidadeDeTurmasNoCurso(idCursoNaJornada);
                turma.Nome = turma.Curso.Nome + " " + (quantidadeDeTurmas + 1);               

                int idTurma = repTurma.Inserir(turma);

                foreach (Instrutor_Monitor instrutor in turma.Instrutores)
                {
                    repTurma.InserirInstrutorNaTurma(instrutor.Cpf, idTurma);                
                }

                if (turma.Monitores != null)
                {
                    foreach (Instrutor_Monitor monitor in turma.Monitores)
                    {

                        repTurma.InserirInstrutorNaTurma(monitor.Cpf, idTurma);
                    }
                }

                return true;
            }
            catch(Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "InserirTurma - Negocio");
                throw ex;
            }
        }
        public bool Editar(Turma turma)
        {
            try
            {
                if (turma.DataInicial.CompareTo(turma.DataFinal) > 0)
                {
                    throw new PeriodoInvalidoException();
                }

                int quantidadeDeTurmas = repTurma.GetQuantidadeDeTurmasNoCurso(turma.IdJornadaCurso);
                turma.Nome = turma.Curso.Nome + " " + (quantidadeDeTurmas + 1);   
                return repTurma.Editar(turma);
            }
            catch (Exception ex)
            { 
                Auxiliar.GravaLog(ex.Message, "EditarTurma - Negocio");
                throw ex;
            }
        }
        public bool Remover(Turma turma)
        {
            try
            {
                return repTurma.Remover(turma);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "RemoverTurma - Negocio");
                throw ex;
            }
        }

        public Turma Consultar(int idTurma)
        {
            try
            {
                return repTurma.Consultar(idTurma);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "ConsultarTurma - Negocio");
                throw ex;
            }        
        }
        public List<Turma> ConsultarTodasAsTurmasPorJornada(int idJornada)
        {
            List<Turma> turmas = this.repTurma.ConsultarTodasAsTurmasPorJornada(idJornada);

            if (turmas.Count == 0)
            {
                throw new TurmasInexistentesException();
            }
            else
            {
                return turmas;
            }
        }
        public Int32 GetQuantidadeDeAlunos(Turma turma)
        {
            try
            {
                return repTurma.GetQuantidadeDeAlunos(turma);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "GetQuantidadeDeAlunos");
                throw ex;
            }
        
        }
        public Dictionary<int, int> GetQuantidadeDeAlunosEmTodasAsTurmas(int idJornada)
        {
            try
            {
                return repTurma.GetQuantidadeDeAlunosEmTodasAsTurmas(idJornada);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "GetQuantidadeDeAlunosEmTodasAsTurmas - negocio");
                throw ex;
            }
        }

    }
}
